/*
  学习目标：类型约束
  作用：指定更精准的类型 - 缩窄类型取值返回
    1. 添加约束 - 给泛型添加约束
*/

// function fn<T>(value: T): T {
//   console.log(value.length);
//   return value;
// }

interface ILength {
  length: number;
}

//  T extends Xxx，表示：接收的参数T，一定有一个length的属性
// 理解：类似逻辑且。😎不仅是个泛型，还是个有length属性的泛型，没有则报错。
function fn<T extends ILength>(value: T): T {
  console.log(value.length);
  return value;
}

// string 继承了String()的原型对象 ，原型身上有length
fn('a');
// 数组 继承了 Array()的原型对象， 原型身上有length
fn([]);
// 对象本身就有length，
fn({ length: 123 });

// 布尔没有length属性
fn(false);
